home *** CD-ROM | disk | FTP | other *** search
/ Computer Select (Limited Edition) / Computer Select.iso / pcmag / v11n08 / wprints.exe / WPRINC.EXE / PRINT.C < prev    next >
C/C++ Source or Header  |  1992-02-13  |  10KB  |  377 lines

  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. #include <sys\types.h>
  6. #include <sys\stat.h>
  7. #include <io.h>
  8. #include <errno.h>
  9. #include <fcntl.h>
  10. #include "wprint.h"
  11.  
  12. static int nScaleMode, nMagnifyBy;
  13.  
  14.  
  15. BOOL PrintDragList (void)
  16. {
  17. BOOL result = FALSE;
  18. char szfilename[144];
  19. HANDLE hDIB;
  20. FARPROC lp = MakeProcInstance(PrintDlgProc, hInst);
  21.  
  22. hDlgPrint = CreateDialog (hInst, "PRINTBOX", hWndParent, lp);
  23.  
  24. nScaleMode = GetProfileInt ((LPSTR)"WinPrint\0",(LPSTR)"Scale\0",-1)-1;
  25. nMagnifyBy = GetProfileInt ((LPSTR)"WinPrint\0",(LPSTR)"MagnifyBy\0",-1);
  26.  
  27. if (nScaleMode < 0 || nMagnifyBy < 0)
  28.     Error(IDS_WININI);
  29.  
  30. for ( i=0 ; i < (int)wNumDrop ; i++ ){
  31.  
  32.     lstrcpy ((LPSTR)szfilename, (LPSTR)lpDragList[i].szFileName);
  33.  
  34.     SetDlgItemText (hDlgPrint, IDD_FILENAME,szfilename);        
  35.  
  36.     hDIB = AttemptOpeningDIB (szfilename);
  37.     
  38.     SetDlgItemText (hDlgPrint, IDD_FILETYPE, (LPSTR)(hDIB == NULL ?
  39.                                        "Text File\0" : "Bitmap File\0"));
  40.     
  41.     result = ((hDIB == NULL) ? PrintTextFile (szfilename) : 
  42.                                PrintBitmap (szfilename,hDIB));
  43.  
  44.     if (result) Error(IDS_NOPRINT) ;
  45. } // end of for loop...
  46.  
  47. DestroyWindow (hDlgPrint);
  48.  
  49. FreeProcInstance (lp);
  50.  
  51. return !result;
  52. }
  53.  
  54.  
  55. /////////////////////////////////////////////////////////////////////////
  56. //
  57. //  PrintDlgProc()
  58. //
  59. //  hDlg - handle to dialog box window
  60. //  message - message param containing sent message number
  61. //  wParam - extra information word for message parameter.
  62. //  lParam - extra information dword for message parameter.
  63. //
  64. /////////////////////////////////////////////////////////////////////////
  65.  
  66. BOOL FAREXPORT PrintDlgProc(hDlg, message, wParam, lParam)
  67. HWND hDlg;
  68. unsigned message;
  69. WORD wParam;
  70. LONG lParam;
  71. {
  72. switch (message) {
  73.  
  74.     case WM_INITDIALOG:
  75.         CenterWindow (hDlg);
  76.         EnableMenuItem (GetSystemMenu(hDlg, FALSE), SC_CLOSE, MF_GRAYED);
  77.         return (TRUE);
  78.  
  79.     case WM_COMMAND:
  80.         bUserAbort = TRUE;
  81.         EnableWindow (GetParent(hDlg), TRUE);
  82.         DestroyWindow (hDlg);
  83.         hDlgPrint = 0;
  84.         return TRUE;
  85.  
  86. }
  87. return FALSE;
  88. }
  89.  
  90. /////////////////////////////////////////////////////////////////////////
  91. //
  92. //  AbortProc()
  93. //
  94. //  hdcPrn - Printer Device Context...
  95. //  nCode  - Error code passed to AbortProc by Escape...
  96. //
  97. /////////////////////////////////////////////////////////////////////////
  98. BOOL FAREXPORT AbortProc (HDC hdcPrn, short nCode)
  99. {
  100. MSG msg;
  101.  
  102. while (!bUserAbort && PeekMessage (&msg,NULL,0,0,PM_REMOVE)){
  103.     if (!hDlgPrint || !IsDialogMessage (hDlgPrint, &msg)){
  104.         TranslateMessage (&msg);
  105.         DispatchMessage (&msg);
  106.     }
  107. }
  108.  
  109. return !bUserAbort;
  110. }
  111.  
  112. /////////////////////////////////////////////////////////////////////////
  113. //
  114. //  PrintTextFile()
  115. //
  116. //  filename - Name of file to print.
  117. //
  118. /////////////////////////////////////////////////////////////////////////
  119. BOOL PrintTextFile (char * filename)
  120. {
  121. BOOL bError = FALSE;
  122. HDC hdcPrn;
  123. char szMessage[128];
  124. TEXTMETRIC tm;
  125. short dy, charsPerLine, linesPerPage, xMargin, yMargin;
  126.  
  127. if (NULL == (hdcPrn = GetPrinterDC ()))
  128.     return TRUE;
  129.  
  130. bUserAbort = FALSE;
  131.  
  132. GetTextMetrics (hdcPrn, &tm);
  133.  
  134. // margins (multiplied by 2). Half inch horizontal and inch vertical margins.
  135. xMargin = GetDeviceCaps (hdcPrn, LOGPIXELSX) ;
  136. yMargin = 2*GetDeviceCaps (hdcPrn, LOGPIXELSY) ;
  137.  
  138. // Allow for half-inch horizontal margins...
  139. charsPerLine = (GetDeviceCaps (hdcPrn, HORZRES) - xMargin)/tm.tmAveCharWidth ;
  140.  
  141. dy = tm.tmHeight + tm.tmExternalLeading;
  142.  
  143. linesPerPage = (GetDeviceCaps (hdcPrn, VERTRES) - yMargin) / dy;
  144.  
  145. // safeguard in case lines run greater than 128 chars (size of buffer)...
  146. if (charsPerLine > 128) charsPerLine = 128 ;
  147.  
  148. EnableWindow (hWndParent, FALSE);  // wouldn't want someone to drag another
  149.                                    // file while printing.
  150.  
  151. lpfnAbortProc = MakeProcInstance (AbortProc, hInst);
  152. Escape (hdcPrn, SETABORTPROC, 0, (LPSTR) lpfnAbortProc, NULL);
  153.  
  154. sprintf (szMessage, "Printing: %s", filename);   // for print manager
  155.  
  156.  
  157. if (Escape (hdcPrn, STARTDOC, sizeof (szMessage)-1, szMessage, NULL) > 0){
  158.     FILE * file = fopen (filename, "r+t");
  159.     char szBuffer [128];
  160.     int nLine=0;
  161.         
  162.     if (file==NULL) bError = TRUE ; 
  163.  
  164.     /* read in the maximum amount of characters per line */
  165.  
  166.     while (fgets(szBuffer, charsPerLine, file) != NULL){
  167.  
  168.         szBuffer[strlen(szBuffer)-1] = '\0';  // get rid of '\n' in printout.
  169.  
  170.         TextOut (hdcPrn, xMargin/2, 
  171.                  dy*nLine + (yMargin/2),(LPSTR)szBuffer, strlen(szBuffer));
  172.  
  173.         nLine++ ;    // increment line counter...
  174.  
  175.         if (nLine > linesPerPage){
  176.             if (Escape (hdcPrn, NEWFRAME, 0, NULL, (LPSTR)&rect) < 0){
  177.                 bError = TRUE;
  178.                 break ;
  179.             }
  180.             if (bUserAbort) break ;
  181.             nLine = 0 ;   // reset the line counter because new page...
  182.         }
  183.     }  // end of while statement...
  184.  
  185.     // This processes the page that did not go to the end of the page.
  186.     if (Escape (hdcPrn, NEWFRAME, 0, NULL, (LPSTR)&rect) < 0)
  187.         bError = TRUE;
  188.  
  189.     if (fclose (file))
  190.         MessageBox (NULL, "File was not closed successfully","Error",MB_OK|MB_TASKMODAL);
  191. }
  192. else
  193.     bError = TRUE;
  194.  
  195. if (!bError) Escape (hdcPrn, ENDDOC, 0, NULL, NULL) ;   // end print job...
  196.  
  197. /******   Assuming everything went OK, we're done printing...  ******/
  198.  
  199. if (!bUserAbort)
  200.     EnableWindow (hWndParent, TRUE);
  201.  
  202.  
  203. FreeProcInstance (lpfnAbortProc);
  204. DeleteDC (hdcPrn);
  205.  
  206. return bError || bUserAbort;
  207. }
  208.  
  209.  
  210. ////////////////////////////////////////////////////////////////////////
  211. // 
  212. // 
  213. //  PrintBitmap() 
  214. // 
  215. //  Prints a bitmap file using the banding logic. 
  216. // 
  217. //  filename  - string containing name of bitmap file. 
  218. //  hDIB - A memory handle to DIB. 
  219. // 
  220. ////////////////////////////////////////////////////////////////////////
  221.  
  222.  
  223. BOOL PrintBitmap (char * filename, HANDLE hDIB) 
  224. // Unitialized local variables : 
  225. char    szMessage[128]; 
  226. int     dx, dy, xRes, yRes, xSize, ySize; 
  227. RECT   Rect; 
  228. // Initialized local variables : 
  229. LONG   lDIBDims   = GetDIBDimensions (hDIB); 
  230. HDC     hdcPrn     = GetPrinterDC(); 
  231. BOOL    bError     = FALSE; 
  232.  
  233.     if (!hdcPrn) return TRUE; 
  234.  
  235.     EnableWindow (hWndParent, FALSE); 
  236.  
  237.     bUserAbort = FALSE; 
  238.  
  239.     /* Make a procedure instance of the exported AbortProc() and donate it 
  240.        to the GDI */ 
  241.     lpfnAbortProc = MakeProcInstance (AbortProc, hInst); 
  242.     Escape (hdcPrn, SETABORTPROC, 0, (LPSTR) lpfnAbortProc, NULL); 
  243.  
  244.     xSize = GetDeviceCaps(hdcPrn, HORZRES); 
  245.     ySize = GetDeviceCaps(hdcPrn, VERTRES); 
  246.     xRes  = GetDeviceCaps(hdcPrn, LOGPIXELSX); 
  247.     yRes  = GetDeviceCaps(hdcPrn, LOGPIXELSY); 
  248.          
  249.     switch (nScaleMode){
  250.         case FIT_TO_X:  // case mode is fit to page...
  251.             dx = xSize - xRes; 
  252.             dy = (int)((LONG)dx * HIWORD(lDIBDims)/LOWORD(lDIBDims)); 
  253.  
  254.             /* Fix bounding rectangle for the picture .. */ 
  255.             SetRect (&Rect, xRes/2, yRes, dx, dy);
  256.             break;
  257.  
  258.         case PRINTER_RES:  // case mode is printer resolution...
  259.             SetRect (&Rect, xRes/2, yRes, LOWORD(lDIBDims),
  260.                      HIWORD(lDIBDims));
  261.             break;
  262.  
  263.         case MAGNIFY:  // case mode is scale by a magnification amount...
  264.             SetRect (&Rect, xRes/2, yRes, 
  265.                      LOWORD(lDIBDims) * nMagnifyBy,
  266.                      HIWORD(lDIBDims) * nMagnifyBy);
  267.             break;            
  268.  
  269.         default:
  270.             FreeProcInstance (lpfnAbortProc);
  271.             DeleteDC (hdcPrn);
  272.             return TRUE;
  273.     } 
  274.     
  275.     wsprintf ((LPSTR)szMessage, "Printing: %s", (LPSTR)filename); 
  276.  
  277.     if (Escape (hdcPrn, STARTDOC, sizeof (szMessage)-1, szMessage, NULL) > 0){ 
  278.         RECT BandRect; 
  279.  
  280.         Escape (hdcPrn, NEXTBAND, 0, (LPSTR)NULL, (LPSTR)&BandRect); 
  281.  
  282.         while (!IsRectEmpty(&BandRect) && !bUserAbort){ 
  283.  
  284.             DPtoLP  (hdcPrn,(LPPOINT)&BandRect,2); 
  285.  
  286.             (* lpfnAbortProc) (hdcPrn, 0);  /* let AbortProc do a check */ 
  287.  
  288.             
  289.             if (!DrawBitmap (hdcPrn, Rect.left,Rect.top,  
  290.                  Rect.right,Rect.bottom, hDIB)) 
  291.                  Error(IDS_ERRORBM);     
  292.  
  293.             /* find out the dimensions of the next band */         
  294.             Escape (hdcPrn, NEXTBAND, 0, (LPSTR)NULL, (LPSTR)&BandRect); 
  295.         } 
  296.     }  
  297.     else 
  298.         bError = TRUE; 
  299.  
  300.     /* Tell GDI to tell the device driver that we are done with the print 
  301.        job */ 
  302.     if (!bError) Escape (hdcPrn, ENDDOC, 0, NULL, NULL) ; 
  303.  
  304.     if (!bUserAbort) 
  305.         EnableWindow (hWndPa